Code:
; [ARMIPS 0.9+] Better parallel cam patch
;is 0 when from mario cam, is not 0 if in lakitu
.defineLabel RAM_STATE, 0x41D20
.defineLabel RAM_STATE_HI, 0x8028
.defineLabel RAM_STATE_LO, 0x6D20
.defineLabel IS_PARALLEL, 0x41D24
.defineLabel IS_PARALLEL_HI, 0x8028
.defineLabel IS_PARALLEL_LO, 0x6D24
.defineLabel MARIO_FACE_HI, 0x8033
.defineLabel MARIO_FACE_LO, 0xDF60
.defineLabel MARIO_FACE_OF, 0x0012
.defineLabel LAKITU_ANGLE_HI, 0x8034
.defineLabel LAKITU_ANGLE_LO, 0xC778
.defineLabel INPUTS_HI, 0x8034
.defineLabel INPUTS_LO1, 0xAFA0 ; hold
.defineLabel INPUTS_LO2, 0xAFA0 ; press
;============Hook mario and lakitu cam functions==============
.orga 0x41BBC
.area 0x8
B mariocamhook ; original: BEQ T5, R0, 0x41C54 -- selector between mario and lakitu cam
NOP
.endarea
.orga 0x41C7C
.area 0x8
B lakitucamhook ; original: JR T9
NOP
.endarea
;=========================End Hooks===========================
;Set mario cam hook onto place where bad lakitu cams live
;restrict payload to fit before 41D20 which is RAM
.orga 0x41CD4
.area 0x4C
mariocamhook:
BEQ T5, R0, 0x41C54
NOP
;====================Mario hook code=====================
LUI AT, IS_PARALLEL_HI
LW T0, 0x6D24(AT)
BEQ T0, R0, mariocamhook_refixlakitu
NOP
B mariocamhook_endrefixlakitu
NOP
mariocamhook_refixlakitu:
LUI AT, RAM_STATE_HI
SW R0, 0x6D20(AT)
mariocamhook_endrefixlakitu:
;====================Mario hook end======================
B 0x41BC4
NOP
.endarea
;============Initilize RAM data with zeroes==================
.orga 0x41D20
.area 0x8
NOP
NOP
.endarea
;============================================================
;Set lakitu cam hook onto place where bad lakitu cam code live
.orga 0x3DC3C
.area 0x134
lakitucamhook:
;====================Lakitu hook code====================
;
;--------------------------------------------------------
; Remove all low lakitu cam codes
;--------------------------------------------------------
;
LUI T0, 0x8028
ADDI T0, T0, 0x6CB4
SUB T0, T9, T0
BLEZ T0, lakitucamhook_nofixoverflow
NOP
LUI T9, 0x8028
ADDI T9, T9, 0x6CC4
lakitucamhook_nofixoverflow:
;
;--------------------------------------------------------
; Check for L button press to switch modes
;--------------------------------------------------------
;
LUI AT, INPUTS_HI
LH T0, 0xAFA2(AT)
ANDI T0, T0, 0x0020
BEQ T0, R0, lakitucamhook_nolpress
NOP
LUI AT, IS_PARALLEL_HI
LW T0, 0x6D24(AT)
ADDI AT, R0, 0x0001
SUB T0, AT, T0
LUI AT, IS_PARALLEL_HI
SW T0, 0x6D24(AT)
lakitucamhook_nolpress:
;
;--------------------------------------------------------
; Use parallel lakitu if L was pressed
;--------------------------------------------------------
;
LUI AT, IS_PARALLEL_HI
LW T0, 0x6D24(AT)
BEQ T0, R0, lakitucamhook_nobeparallel
NOP
;flying check
LUI T0, 0x8028
ADDI T0, T0, 0x6C84
SUB T0, T9, T0
BEQ T0, R0, lakitucamhook_beparallel
NOP
;water check
LUI T0, 0x8028
ADDI T0, T0, 0x6CA4
SUB T0, T9, T0
BEQ T0, R0, lakitucamhook_beparallel
NOP
B lakitucamhook_nobeparallel
NOP
lakitucamhook_beparallel:
LUI T9, 0x8028
ADDI T9, T9, 0x6CC4
lakitucamhook_nobeparallel:
;
;--------------------------------------------------------
; Rotate lakitu cam on dpad presses
;--------------------------------------------------------
;
LUI AT, INPUTS_HI
LH T0, 0xAFA0(AT)
LUI AT, LAKITU_ANGLE_HI
LH A0, 0xC778(AT)
ANDI AT, T0, 0x0200
BEQ AT, R0, lakitucamhook_noleft
NOP
ADDI A0, A0, 0xFFD0
B lakitucamhook_minirotateend
lakitucamhook_noleft:
ANDI AT, T0, 0x0100
BEQ AT, R0, lakitucamhook_noright
NOP
ADDI A0, A0, 0x0030
B lakitucamhook_minirotateend
lakitucamhook_noright:
LUI AT, INPUTS_HI
LH T0, 0xAFA2(AT) ;using press
ANDI AT, T0, 0x0C00
BEQ AT, R0, lakitucamhook_minirotateend
NOP
ADDI A0, A0, 0x1000
ANDI A0, A0, 0xE000
lakitucamhook_minirotateend:
LUI AT, LAKITU_ANGLE_HI
SH A0, 0xC778(AT)
;
;--------------------------------------------------------
; Get last state of lakitu cam and line it if needed
;--------------------------------------------------------
;
LUI AT, RAM_STATE_HI
LW T0, 0x6D20(AT)
BEQ T0, T9, lakitucamhook_fixangleend ;no fix required
NOP
LUI AT, MARIO_FACE_HI
LW T0, 0xDF60 (AT)
LH T0, 0x0012 (T0)
;Rotate camera to be behind mario and make it 8-way
ADDI T0, T0, 0x9000
ANDI T0, T0, 0xE000
LUI AT, LAKITU_ANGLE_HI
SH T0, 0xC778(AT)
;Store new mode of camera
LUI AT, RAM_STATE_HI
SW T9, 0x6D20 (AT)
lakitucamhook_fixangleend:
;====================Lakitu hook end=====================
JR T9
NOP
.endarea